//给你一个整数 n ，请你找出并返回第 n 个 丑数 。 
//
// 丑数 就是只包含质因数 2、3 和/或 5 的正整数。 
//
// 
//
// 示例 1： 
//
// 
//输入：n = 10
//输出：12
//解释：[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。
// 
//
// 示例 2： 
//
// 
//输入：n = 1
//输出：1
//解释：1 通常被视为丑数。
// 
//
// 
//
// 提示： 
//
// 
// 1 <= n <= 1690 
// 
//
// Related Topics 哈希表 数学 动态规划 堆（优先队列） 👍 1102 👎 0

package leetcode.editor.cn;
//java:丑数 II
public class Q0264UglyNumberIi {
    public static void main(String[] args){
        Solution solution = new Q0264UglyNumberIi().new Solution();
        solution.nthUglyNumber(10);
    }
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int nthUglyNumber(int n) {
        if (n < 1 || n > 1690) return 0;
        int[] dp = new int[n + 1];
        dp[1] = 1;
        // a *2所在的下标，b *3所在的下标， c *5所在的下标
        int a = 1, b = 1, c = 1;
        for (int i = 2; i < n + 1; i++) {
            dp[i] = Math.min(Math.min(dp[a] * 2, dp[b] * 3), dp[c] * 5);
            if (dp[i] == dp[a] * 2) a++;
            if (dp[i] == dp[b] * 3) b++;
            if (dp[i] == dp[c] * 5) c++;
        }
        return dp[n];
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}